package com.example.servlet;

import com.example.Service.CommentService;
import com.example.pojo.Comment;
import com.google.gson.Gson;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@WebServlet(name = "AddCommentServlet", value = "/AddCommentServlet")
public class AddCommentServlet extends HttpServlet {
    private CommentService commentService = new CommentService(); // 提前初始化，避免重复创建

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 设置请求/响应编码（防止中文乱码）
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");

        // 2. 接收前端提交的表单参数（对应前端 data 里的字段）
        String userId = req.getParameter("userId"); // 登录用户ID（前端传递）
        String newsIdStr = req.getParameter("newsId"); // 新闻ID（前端传递）
        String commentContent = req.getParameter("commentContent"); // 评论内容（前端传递）

        // 3. 初始化返回结果
        Map<String, Object> result = new HashMap<>();
        PrintWriter out = resp.getWriter();
        Gson gson = new Gson();

        try {
            // 4. 必填参数校验（防止空指针和无效数据）
            if (userId == null || userId.trim().isEmpty()) {
                result.put("code", 500);
                result.put("msg", "用户未登录");
                out.print(gson.toJson(result));
                return;
            }
            if (newsIdStr == null || newsIdStr.trim().isEmpty() || !newsIdStr.matches("\\d+")) {
                result.put("code", 500);
                result.put("msg", "新闻ID无效");
                out.print(gson.toJson(result));
                return;
            }
            if (commentContent == null || commentContent.trim().isEmpty()) {
                result.put("code", 500);
                result.put("msg", "评论内容不能为空");
                out.print(gson.toJson(result));
                return;
            }
            if (commentContent.length() > 500) {
                result.put("code", 500);
                result.put("msg", "评论内容不能超过500字");
                out.print(gson.toJson(result));
                return;
            }

            // 5. 转换参数类型
            int newsId = Integer.parseInt(newsIdStr);

            // 6. 自动生成评论时间（格式：yyyy-MM-dd HH:mm:ss，和前端一致）
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String commentDate = sdf.format(new Date());

            // 7. 构造 Comment 对象（commentId 由数据库自增，无需传递）
            Comment comment = new Comment(
                    0, // commentId：数据库自增，传0即可
                    userId,
                    newsId,
                    commentContent,
                    commentDate,
                    0 // 初始点赞数：0
                    // isLiked：无需设置，前端加载时由后端查询
            );

            // 8. 调用 Service 层添加评论
            int flag = commentService.addComment(comment);
            if (flag > 0) {
                result.put("code", 200);
                result.put("msg", "评论发表成功");
            } else {
                result.put("code", 500);
                result.put("msg", "评论发表失败，请重试");
            }
        } catch (Exception e) {
            // 捕获异常（避免程序崩溃）
            e.printStackTrace();
            result.put("code", 500);
            result.put("msg", "服务器异常：" + e.getMessage());
        } finally {
            // 9. 返回结果给前端
            out.print(gson.toJson(result));
            out.close();
        }
    }

    // 废弃 doGet 方法（添加评论用 POST，避免 GET 暴露参数）
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Map<String, Object> result = new HashMap<>();
        result.put("code", 405);
        result.put("msg", "不支持GET请求，请使用POST");
        out.print(new Gson().toJson(result));
        out.close();
    }
}